public class SortColors {
    // 颜色分类
    // https://leetcode.cn/problems/sort-colors/?envType=study-plan-v2&envId=top-100-liked
    public void sortColors(int[] nums) {
        // 通过left、i和right将数组分为四个部分
        // [0,left]为0，(left,i]为1，(i, right)待遍历的部分，[left, len-1]为2
        // left指向0的最后一个位置，right指向2的最后一个位置
        int left = -1, right = nums.length, i = 0;
        while (i < right) {
            if (nums[i] == 0) {
                swap(nums, ++left, i++);
            } else if (nums[i] == 1) {
                i++;
            } else {
                swap(nums, --right, i);
            }
        }
    }

    private void swap(int[] nums, int x, int y) {
        int tmp = nums[x];
        nums[x] = nums[y];
        nums[y] = tmp;
    }
}
